﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using SOM.ConcreteBL;
using SOM.AbstractDAL;
using SOM.ConcreteDAL;
using SOM.ConcreteDALFactory;
using SOM.AbstractDALFactory;
using SOM.Model;
using SOM.Security;
using SOM.Common;


public partial class Usuario_CadastroUsuario : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {

            switch (RetornarTipoOperacao())
            {
                case TipoOperacao.Alteracao:
                    this.lkbAlterarSenha.Visible = true;
                    this.lkbExcluirConta.Visible = true;
                    lbkVerfDisponibilidade.Visible = false;

                    rfvSenha.Enabled = false;
                    ctvValidatorUsuario.Enabled = false;

                    Usuario usuario = Common.RetornarUsuarioSessao(this);

                    if (usuario == null)
                        FormsAuthentication.RedirectToLoginPage();
                    else
                    {
                        this.PreencherFormulario(usuario.usr_ds_nickname);
                    }
                    break;

                default:
                    this.lkbAlterarSenha.Visible = false;
                    this.lkbExcluirConta.Visible = false;
                    this.frmAlterarSenha.Visible = false;
                    this.frmConfirmarExclusao.Visible = false;
                    lbkVerfDisponibilidade.Visible = true;
                    return;


            }
        }


    }

    private void PreencherFormulario(string usuarioNickname)
    {
        SOMAbstractDALFactory factory = new SOMConcreteDALFactory();
        AbstractUsuarioDAL usuarioDAL = factory.CreateUsuarioDAL();

        Usuario usuario = usuarioDAL.FindByNickname(usuarioNickname, "end_endereco");

        if (usuario != null)
        {
            txtNome.Text = usuario.usr_nm_usuario;
            txtCPF.Text = usuario.usr_nu_cpf;
            txtRG.Text = usuario.usr_nu_rg;
            txtTelefone.Text = usuario.usr_nu_telefone;
            txtEmail.Text = usuario.usr_ds_email;
            txtDataNascimento.Text = usuario.usr_dt_nascimento.ToShortDateString();
            txtUsuario.Text = usuario.usr_ds_nickname;

            Endereco endereco = usuario.end_endereco;

            txtLogradouro.Text = endereco.end_nm_logradouro;
            txtBairro.Text = endereco.end_nm_bairro;
            txtCidade.Text = endereco.end_nm_cidade;
            txtEstado.Text = endereco.end_ds_estado;
            txtComplemento.Text = endereco.end_ds_complemento;
            txtCEP.Text = endereco.end_nu_cep;

            //Desabilitar alguns controles
            txtUsuario.Enabled = false;
            txtSenha.Enabled = false;
            txtConfirmarSenha.Enabled = false;
            ctvValidatorUsuario.Enabled = false;
            cmpValidatorSenha.Enabled = false;
            lbkVerfDisponibilidade.Visible = false;
        }
    }

    protected void ctvValidatorUsuario_ServerValidate(object source, ServerValidateEventArgs args)
    {
        if (this.txtUsuario.Text == String.Empty)
        {
            args.IsValid = false;
            return;
        }
        UsuarioBL usuarioBl = new UsuarioBL();
        if (usuarioBl.UsuarioExiste(this.txtUsuario.Text))
        {
            this.imgDispUsuario.Visible = true;
            this.imgDispUsuario.ImageUrl = "~/App_Themes/SomTheme/imagens/cross_icon.png";
            this.imgDispUsuario.ToolTip = "Usuário já existe";
            args.IsValid = false;
        }
        else
        {
            this.imgDispUsuario.Visible = true;
            this.imgDispUsuario.ImageUrl = "~/App_Themes/SomTheme/imagens/Check-icon.png";
            this.imgDispUsuario.ToolTip = "Usuário Válido";
            args.IsValid = true;
        }
    }
    protected void btnSalvar_Click(object sender, EventArgs e)
    {
        try
        {
            if (this.IsValid)
            {
                SOMAbstractDALFactory factory = new SOMConcreteDALFactory();
                AbstractUsuarioDAL usuarioDAL = factory.CreateUsuarioDAL();
                UsuarioBL usuarioBL = new UsuarioBL();

                Usuario usuario;
                Endereco endereco;

                if (RetornarTipoOperacao() != TipoOperacao.Alteracao && ValidarUsuario())
                {
                    usuario = new Usuario();
                    usuario.usr_ds_nickname = txtUsuario.Text;
                    usuario.usr_senha = SOMSecurity.MD5Criptografar(txtSenha.Text);
                    usuario.usr_id_grupo = (int)GrupoDoUsuario.Usuario;

                    endereco = new Endereco();
                }
                else
                {
                    usuario = usuarioBL.Load(Common.RetornarUsuarioSessao(this).usr_ds_nickname);
                    endereco = usuario.end_endereco;
                }

                usuario.usr_nm_usuario = txtNome.Text;
                usuario.usr_nu_telefone = txtTelefone.Text;
                usuario.usr_nu_cpf = txtCPF.Text;
                usuario.usr_nu_rg = txtRG.Text;
                usuario.usr_dt_nascimento = Convert.ToDateTime(txtDataNascimento.Text);
                usuario.usr_ds_email = txtEmail.Text;
                usuario.usr_dt_data = DateTime.Now;

                endereco.end_nm_logradouro = txtLogradouro.Text;
                endereco.end_nm_bairro = txtBairro.Text;
                endereco.end_ds_complemento = txtComplemento.Text;
                endereco.end_nu_cep = txtCEP.Text;
                endereco.end_nm_cidade = txtCidade.Text;
                endereco.end_ds_estado = txtEstado.Text;


                usuario.end_endereco = endereco;

                if (RetornarTipoOperacao() != TipoOperacao.Alteracao)
                {
                    if (usuarioBL.CpfExiste(usuario.usr_nu_cpf))
                    {
                        this.lblMensagem.Text = "CPF já existe.";
                        return;
                    }

                    if (usuarioBL.EmailExiste(usuario.usr_ds_email))
                    {
                        this.lblMensagem.Text = "Email já existe.";
                        return;
                    }

                    usuarioBL.Insert(usuario);
                }
                else
                {
                    usuarioBL.Update(usuario);
                }

                this.lblMensagem.Text = "Cadastro relizado com sucesso.";
                SOMSecurity.Autenticar(txtUsuario.Text, txtSenha.Text);
                Session["Usuario"] = txtUsuario.Text;
                Response.Redirect("~/Default.aspx");
            }
        }
        catch (Exception ex)
        {
            lblMensagem.Text = ex.Message + ":" + ex.InnerException;
        }
    }
    protected void btnLimpar_Click(object sender, EventArgs e)
    {
        this.LimparFormulario();
    }

    private void LimparFormulario()
    {
        Control masterPage = this.Controls[0];
        Control formulario = masterPage.FindControl("form1");
        Control content = formulario.FindControl("ContentCenter");

        foreach (Control control in content.Controls)
        {
            if (control is TextBox)
            {
                ((TextBox)control).Text = String.Empty;
            }
        }
    }
    protected void btnCancelar_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/Default.aspx");
    }
    protected void lkbAlterarSenha_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/Usuario/AlterarSenhaUsuario.aspx");
    }

    protected void lkbExcluirConta_Click(object sender, EventArgs e)
    {
        try
        {
            Usuario usuario = Common.RetornarUsuarioSessao(this);

            if (usuario != null)
            {
                Response.Redirect("~/Usuario/ConfirmaExclusaoUsuario.aspx");
            }
            else
            {
                FormsAuthentication.RedirectToLoginPage();
            }
        }
        catch (Exception ex)
        {
            lblMensagem.Text = ex.Message + " " + ex.InnerException;
        }


    }

    protected void btnAlterarSenha_Click(object sender, EventArgs e)
    {
        try
        {
            if (IsValid)
            {
                UsuarioBL usuarioBL = new UsuarioBL();
                Usuario usuario = usuarioBL.Load(Common.RetornarUsuarioSessao(this).usr_ds_nickname);
                SOMAbstractDALFactory factory = new SOMConcreteDALFactory();
                AbstractUsuarioDAL usuarioDAL = factory.CreateUsuarioDAL();
                if (usuario.usr_senha.Equals(SOMSecurity.MD5Criptografar(txtSenhaAntiga.Text)))
                {
                    usuario.usr_senha = SOMSecurity.MD5Criptografar(txtNovaSenha.Text);
                    usuarioBL.Update(usuario);

                    lblMensagem.Text = "Senha alterada com sucesso";

                    if (RetornarTipoOperacao() != TipoOperacao.Alteracao)
                        LimparFormulario();
                }
                else
                {
                    lblMensagem.Text = "Usuário ou senha incorretos.";
                }
            }
        }
        catch (Exception ex)
        {
            lblMensagem.Text = ex.Message + " " + ex.InnerException;
        }

    }

    protected void btnCancelarAlterarSenha_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/Usuario/CadastroUsuario.aspx?op=2");
    }

    protected void btnConfirmarExclusao_Click(object sender, EventArgs e)
    {
        try
        {
            if (Session["Usuario"] == null)
            {
                FormsAuthentication.RedirectToLoginPage();
                return;
            }

            UsuarioBL usuarioBl = new UsuarioBL();

            bool confirmaExclusao = usuarioBl.Delete(Common.RetornarUsuarioSessao(this).usr_ds_nickname, txtSenhaExclusao.Text);

            if (confirmaExclusao)
            {
                Session.Clear();
                FormsAuthentication.SignOut();
                FormsAuthentication.RedirectToLoginPage();
            }
        }
        catch (Exception ex)
        {
            lblMensagem.Text = ex.Message + ":" + ex.InnerException;
        }
    }

    private TipoOperacao RetornarTipoOperacao()
    {
        TipoOperacao tipoOperacao;
        if (Request["op"] != null)
        {
            tipoOperacao = (TipoOperacao)int.Parse(Request["op"]);
        }
        else
        {
            tipoOperacao = (TipoOperacao)1;
        }

        return tipoOperacao;
    }

    protected void lbkVerfDisponibilidade_Click(object sender, EventArgs e)
    {
        ValidarUsuario();
    }
    protected void ctvCPF_ServerValidate(object source, ServerValidateEventArgs args)
    {
        UsuarioBL usuarioBL = new UsuarioBL();
        args.IsValid = usuarioBL.ValidarCPF(txtCPF.Text);
    }

    private bool ValidarUsuario()
    {
        if (string.IsNullOrEmpty(txtUsuario.Text))
        {
            ctvValidatorUsuario.ErrorMessage = "Usuário obrigatório.";
            ctvValidatorUsuario.IsValid = false;
            return false;
        }

        UsuarioBL usuarioBL = new UsuarioBL();
        if (usuarioBL.UsuarioExiste(txtUsuario.Text.Trim()))
        {
            ctvValidatorUsuario.IsValid = false;
            imgDispUsuario.Visible = false;
            imgDispUsuario.ImageUrl = "~/App_Themes/SomTheme/imagens/cross_icon.png";
            imgDispUsuario.ToolTip = "Usuário já existe";
            return false;
        }
        else
        {
            ctvValidatorUsuario.IsValid = true;
            imgDispUsuario.Visible = true;
            imgDispUsuario.ImageUrl = "~/App_Themes/SomTheme/imagens/Check-icon.png";
            imgDispUsuario.ToolTip = "Usuário Válido";
            return true;
        }
    }
}
